/**
 * Servidor
 * 
 */

package htmlreader;
import java.io.*;
import java.net.ServerSocket;
import htmlreader.exceptions.ExceptionErroConexao;
import java.net.Socket;

/**
 *
 * @author leopoldes
 */
public class Servidor {

    private static int portaConexao;
    private static byte[] ip;
    private static String diretorio;
    private static File[] listaDeArquivosHtml;
    private static File[] listaDeArquivosImagem;
    private static Socket socketConexao;
    private static ServerSocket socketRecepcao;    
    private static ObjectOutputStream output;
    private static int comandoRecebido;

    /**
     *
     * @param ip
     * @param porta
     */
    public Servidor(byte[] ip, int porta){

        Servidor.portaConexao = porta;
        Servidor.ip = ip;
    }
    /**
     *
     * @throws java.io.IOException
     * @throws htmlreader.exceptions.ExceptionErroConexao
     */
    public void abrirConexao() throws IOException, ExceptionErroConexao {
        /**
         * Abri a conexão na porta passada por parâmetro
         */
            //Servidor.socketRecepcao = new ServerSocket(Servidor.portaConexao);
            Servidor.socketRecepcao = new ServerSocket(Servidor.portaConexao);
            Servidor.socketConexao = socketRecepcao.accept();        
    }

    /**
     *
     * @throws java.io.IOException
     */
    public void fechaConexao() throws IOException{
        /**
         * Encerra conexão aberta
         */
        //TODO verificar se há alguma transferência em andamento
        Servidor.socketConexao.close();
    }

    /**
     *
     * @throws java.io.IOException
     */
    public void leDadosDaConexao() throws IOException, ClassNotFoundException{
        /**
         * Lê comandos enviados pelo cliente
         */

        Comando c = new Comando();
        //System.out.println("c: " + c.toString());
        ObjectInputStream input = new ObjectInputStream(socketConexao.getInputStream());        
        c = (Comando) input.readObject();
        //System.out.println("c: " + c.toString());
        Servidor.comandoRecebido = c.getComando();
        //System.out.println("Servidor - comando: " + c.toString());
        //System.out.println("Valor no Server: " + Servidor.getComandoRecebido());
        input.close();
    }

    /**
     *
     * @param objeto
     * @throws java.io.IOException
     */
    public void enviaDados(Object objeto) throws IOException{
        /**
         * Envia objeto (arquivos, lista de arquivos) requisitado pelo cliente
         */
        output = new ObjectOutputStream(Servidor.socketConexao.getOutputStream());
        output.flush();

        output.writeObject(objeto);
        output.flush();

        output.close();

    }

    public void listaArquivos(){
        /**
         * Verifica quais arquivos estão disponíveis no servidor
         */
        
        Servidor.listaDeArquivosHtml = carregaDiretorios(Servidor.diretorio);

    }

    /**
     *
     * @param indice
     * @return
     */
    public Object selecionaArquivo(int indice){

        //Cria um objecto com o arquivo especificado da lista
        Object arquivo = new Object();
        if(Servidor.listaDeArquivosHtml != null){
           arquivo = (Object) Servidor.listaDeArquivosHtml[indice];
        }else{
            //TODO: lançar exceção de lista de arquivos vazia
        }
        return arquivo;
    }

    /**
     *
     * @param nomeDiretorio
     * @return
     */
    public File[] carregaDiretorios (String nomeDiretorio){

        //criar um objeto para o deretório
        System.out.println(Servidor.diretorio);//teste
        File dirAtual = new File(Servidor.diretorio);

        //TODO: validar o tipo de arquivo p/ incluir somente 'html'
        //identificar as imagens e adicioná-las em outro atributo

        //criar um Array para os arquivos que estão dentro do diretório
        File[] arquivosInternos = dirAtual.listFiles();

        //Se encontrar algum arquivo dentro do diretótio ele percorre
        //tudo o que foi encontrado com o loop(for).
        
        
        if(arquivosInternos != null){
           for(int i = 0; i< arquivosInternos.length; i++){

              if(arquivosInternos[i].exists() && arquivosInternos[i].isDirectory())
                 carregaDiretorios(arquivosInternos[i].getPath());
            }

        }         

        return arquivosInternos;

    }
   
    public String getDiretorio() {
        return diretorio;
    }

    public void setDiretorio(String diretorio) {
        Servidor.diretorio = diretorio;
        //TODO: atualizar lista de arquivo
    }

    public int getPortaConexao() {
        return portaConexao;
    }

    public void setPortaConexao(int portaConexao) {
        //TODO:
        // Encerrar a conexão atual
        // Setar a nova porta
        Servidor.portaConexao = portaConexao;
        // Estabelecer nova conexão;
    }

    public static byte[] getIp() {
        return ip;
    }

    public static void setIp(byte[] ip) {
        Servidor.ip = ip;
    }

    public static int getComandoRecebido() {
        return comandoRecebido;
    }
     
    public static File[] getListaDeArquivosHtml() {
        return listaDeArquivosHtml;
    }

    public static File[] getListaDeArquivosImagem() {
        return listaDeArquivosImagem;
    }
    

}
